package main

// $ go mod init github.com/zhangxi/grpc_greeter
// $ ==> go mod init grpc_greeter
// $ go mod tidy  #==> 下载项目中引入的第三方包,
// $ protoc --go_out=plugins=grpc:./ *.proto    // 使用 protoc-gen-go.exe
// $ 而不再是 protoc --go_out=./ order.proto

import (
	"context"
	"fmt"
	"grpc_greeter/proto/greeterService"
	"net"

	// "github.com/hashicorp/consul"
	"github.com/hashicorp/consul/api"
	"google.golang.org/grpc"
)

// 1.定义一个远程调用的结构体和方法, 这里我们这个结构体需要实现  GreeterService 的接口,
// type GreeterServer interface { SayHello(context.Context, *HelloReq) (*HelloResp, error) }
type Hello struct{}

func (this Hello) SayHello(c context.Context, req *greeterService.HelloReq) (*greeterService.HelloResp, error) {
	fmt.Println(req)
	return &greeterService.HelloResp{Message: "hello " + req.Name}, nil
}

// $ consul agent -dev   # 开发者模式启动 consul
// ==> Starting Consul agent...
// 这样就启动了一个 consul 的服务器, "http://localhost:8500" 打开web管理界面,

func main() {
	// 注册一个 consul 服务,
	// "$ go get -u -v github.com/hashicorp/consul/api"
	// 1.初始化 consul 配置,
	consulConfig := api.DefaultConfig()
	consulConfig.Address = "127.0.0.1:8500"
	// 2.获取 consul 操作对象,
	consulClient, err := api.NewClient(consulConfig)
	if err != nil {
		fmt.Println("consul api.NewClient() err:", err)
		return
	}
	// 3.配置注册服务的参数,
	agentService := api.AgentServiceRegistration{
		ID:      "1",
		Tags:    []string{"test"},
		Name:    "HelloService",
		Port:    8081,        // HelloService 微服务的端口是 8080, 与 grpcServer 的端口一致,
		Address: "127.0.0.1", // HelloService 微服务的IP是 "127.0.0.1", 与 grpcServer 的地址一致,
		Check: &api.AgentServiceCheck{
			TCP:      "127.0.0.1:8081",
			Timeout:  "5s",  //
			Interval: "30s", // 每隔 30s,
		},
	}
	// 4.注册服务到 consul 上,
	consulClient.Agent().ServiceRegister(&agentService)

	// 注册 grcp 和以前是一样的,
	// 1.初始化一个 grpc 的对象,
	// "$ go get -u -v google.golang.org/grpc"
	grpcServer := grpc.NewServer()
	// 2.注册 grpc 服务,
	greeterService.RegisterGreeterServer(grpcServer, Hello{})
	// 3.监听端口,
	listener, err := net.Listen("tcp", "0.0.0.0:8081")
	if err != nil {
		fmt.Println("net.Listen() err:", err)
		return
	}
	// 4.退出关闭监听,
	defer listener.Close()
	// 5.启动服务,
	grpcServer.Serve(listener)

}
